/**
* @author TDSoft
*
* La clase RemoteInterface proporciona la interface
*   que gestiona el acceso remoto a algunos métodos
*
*/
package edu.uoc.tds.pec4.common;

import edu.uoc.tds.pec4.model.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.util.Date;
import java.util.List;

/**
 * Interficie RMI. Debe extender de la clase java.rmi.Remote
 * Esta clase debe ser visible tanto para cliente como para servidor
 */
public interface RemotoInterface extends Remote {

    //*******
    //CLIENTE
    //*******
    
    //Método que realiza la conexión a la BBDD
    public boolean conectaBBDD() throws RemoteException;
    
    //Método que realiza la desconexión de la BBDD cuando se desea salir en alguna de las pantallas
    public void desconectaBBDD() throws RemoteException;
    
    //Obtiene el schema que se ha recuperado del fichero de configuración para usarlo en las sentencias
    public String getSchema() throws RemoteException;
    
    //Obtiene la conexión que hemos establecido
    public Connection getConexion() throws RemoteException;

    //********
    //USUARIOS
    //********
    
    //Metodo para validar un Usuario a partir de su login y clave introducidos.
    public Usuario validarUsuario(String login, String clave) throws RemoteException ;
    
    //Devuelve una instancia de Universidad correspondiente a un valor de id_universidad.
    public Universidad getUniversidad(int id_universidad) throws RemoteException;
    
    //Devuelve el identificador de la universidad a partir de su nombre.
    public int getIdUniversidad(String nombre_universidad) throws RemoteException;
    
    //Obtiene la lista de todas la universidades disponibles en el sistema.
    public List<Universidad> getUniversidades() throws RemoteException;
    
    //Devuelve true si el objeto usuario hacer referencia a una instancia de clase Estudiante.
    //Devuelve false en caso contrario.
    public boolean isEstudiante(Usuario usuario) throws RemoteException;
    
    //Devuelve true si el objeto usuario hacer referencia a una instancia de clase Administrador.
    //Devuelve false en caso contrario.
    public boolean isAdministrador(Usuario usuario) throws RemoteException;
    
    //Devuelve true si el objeto usuario hacer referencia a una instancia de clase ResponsablePrueba.
    //Devuelve false en caso contrario.
    public boolean isResponsablePrueba(Usuario usuario) throws RemoteException;
    
    //Obtiene la instancia Estudiante a la que hace referencia el objeto usuario.
    public Estudiante getEstudiante(Usuario usuario) throws RemoteException;
    
    //Obtiene la instancia Administrador a la que hace referencia el objeto usuario.
    public Administrador getAdministrador(Usuario usuario) throws RemoteException;
    
    //Obtiene la instancia ResponsablePrueba a la que hace referencia el objeto usuario.
    public ResponsablePrueba getResponsablePrueba(Usuario usuario) throws RemoteException;
    
    //Realiza el alta de un usuario, a partir de los datos introducidos por el Administrador y que 
    //se pasan como parámetros.
    public Usuario altaUsuario(int id_tipo_usuario, String login, String clave, String documento,
                                String nombre, String apellidoPrimero, String apellidoSegundo, 
                                int id_universidad, Date fechaAlta) throws RemoteException;
    
    //Realiza la baja lógica de un usuario. Se pasan por parámetro el identificador del usuario
    //y la fecha de la baja.
    public void bajaUsuario(int id_usuario, Date fecha_baja) throws RemoteException;
    
    //Obtiene la lista de usuarios a partir de los filtros pasados por parámetro.
    public List<Usuario> getListaUsuarios(int id_tipo_usuario,int id_usuario, String documento, 
                                          String nombre, String apellido_primero, Date fecha_alta,
                                          String operador_fecha_alta, boolean activos,
                                          Date fecha_baja, String operador_fecha_baja,
                                          int id_universidad) throws RemoteException;
    
    //Obtiene la lista de pruebas pendientes que tiene un Estudiante.
    public List<Prueba> getListaPruebasEstudiante(int id_usuario) throws RemoteException;
    
    //Comprueba si el login introducido por el Administrador en el caso de uso de Alta de usuarios, ya existe en el sistema.
    public boolean existeLogin(String login_usuario) throws RemoteException;
    
    //Comprueba si el documento introducido por el Administrador en el caso de uso de Alta de usuarios, ya existe en el sistema.
    public boolean existeDocumento(String documento) throws RemoteException;
    
    //Obtiene un usuario, a partir de un id_usuario
    public Usuario getUsuario(int id_usuario) throws RemoteException;

    //********
    //PRUEBAS
    //********
    //<<FTM
    public Prueba getPrueba(int id_prueba) throws RemoteException;

    public int insertarPrueba(Prueba prueba) throws RemoteException;
    public void anularPrueba(int id_prueba) throws RemoteException;
    public void actualizarPrueba(Prueba prueba, TipoEstado tipoEstado) throws RemoteException;
    public boolean validarPrueba(Prueba prueba) throws RemoteException;
    
    public List<Prueba> getListaPruebas() throws RemoteException;
    public List<Prueba> getListaPruebas(Prueba prueba) throws RemoteException;
    public List<Prueba> getListaPruebasPorEstado(TipoEstado tipoEstado) throws RemoteException;
    
    public Date getFechaInicioInscripcionPrueba(Prueba prueba) throws RemoteException;
    public Date getFechaFinInscripcionPrueba(Prueba prueba) throws RemoteException;
    public String getDescripcionPrueba(Prueba prueba) throws RemoteException;
    public String getDescripcionEstadoPrueba(int id_estado_prueba) throws RemoteException;

    public boolean hayRondaClasificatoria(int numeroInscritos) throws RemoteException;
    public boolean hayRondaEliminatoria(int numeroInscritos) throws RemoteException;

    //Inscripcion
    public int getNumeroInscritos(int id_prueba) throws RemoteException;
    public boolean hayInscritosSuficientes(int numeroInscritos) throws RemoteException;
    public List<Usuario> getListaEstudiantesInscritosEnPrueba(Prueba prueba) throws RemoteException;
    public void realizarInscripcionUsuarios(Usuario usuario, Ronda ronda) throws RemoteException;
    public boolean estaInscritoEnPrueba(Estudiante estudiante, Prueba prueba) throws RemoteException;
    public List<Inscripcion> getListaInscritosEnPrueba(Prueba prueba) throws RemoteException;
    public void valorarParticipacionEnRonda(Prueba prueba, TipoEstado tipoEstado) throws RemoteException;
    public List<Usuario> getListaTOPEstudiantesInscritosEnRonda(Ronda ronda) throws RemoteException;
    public String getDescripcionTipoRonda(int id_tipo_ronda) throws RemoteException;
    public boolean realizarBajaInscripcionPrueba(Estudiante estudiante, Prueba prueba) throws RemoteException;
    public boolean realizarAltaInscripcionPrueba(Estudiante estudiante, Prueba prueba) throws RemoteException;

    //InscripcionRonda
    public boolean guardarRespuestasUsuarios(Usuario usuario, Ronda ronda, String respuestas) throws RemoteException;
    public boolean haRealizadoRonda(Estudiante estudiante, Ronda ronda) throws RemoteException;

    //Rondas
    public Ronda getRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException;

    public void insertarRonda(Ronda ronda) throws RemoteException;
    public void cerrarRonda(Prueba prueba, TipoRonda tipoRonda, Usuario usuario) throws RemoteException;
    public boolean validarRonda(Ronda ronda) throws RemoteException;
    public boolean existeRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException;
    public boolean existeRonda(Ronda ronda) throws RemoteException;
    public List<Ronda> getListaRondas() throws RemoteException;
    public List<Ronda> getListaRondasEnRealizacion() throws RemoteException;

    public void actualizarRonda(Ronda ronda) throws RemoteException;
    public Date getFechaInicioRealizacionRonda(Prueba prueba, TipoRonda tipoRonda) throws RemoteException;
    public List<Usuario> getListaEstudiantesInscritosEnRonda(Ronda ronda) throws RemoteException;
    public String getRespuestasEstudiantes(Ronda ronda, Usuario usuario) throws RemoteException;
    public String getRespuestasSolucion(Prueba prueba, TipoRonda tipoRonda) throws RemoteException;
    
    public void ordenarInscripcionRondaPorPuntuacionYFecha(Prueba prueba, TipoRonda tipoRonda) throws RemoteException;

    //Preguntas
    public List<Pregunta> getListaPreguntas(int numeroPreguntas) throws RemoteException;
    public Pregunta getPregunta(int id_pregunta) throws RemoteException;

    //>>FTM
    
    //GestorEstadistica
    public int numPrueba() throws RemoteException;
    public int pruebasEnCurso() throws RemoteException;
    public int pruebasFinalizadas() throws RemoteException;
    public int estudiantesInscritos() throws RemoteException;
    public int universidadesParticipantes() throws RemoteException;
    public int medallas() throws RemoteException;
    public int pruebasInscripcion() throws RemoteException;
    public int inscritosPruebasConCierre() throws RemoteException;
    public String participantesDeInscritos() throws RemoteException;
    public double puntuacionMedia() throws RemoteException;
    public double preguntasMedias() throws RemoteException;
    public String aciertosPreguntas() throws RemoteException;
    public List<Medallero> obtenerMedallero() throws RemoteException;
    public List<ResultadoEstudiante> obtenerResultadosEstudiante(Estudiante estudiante) throws RemoteException;
    public List<PruebaDetalleEstadistico> obtenerPruebaDetalleEstadistico() throws RemoteException;
    public List<ParticipantesEstadistica> obtenerParticipantes(int iP, int iTP, String fD, String fH) throws RemoteException;
   
}


